# coding=utf-8
"""
https://zhuanlan.zhihu.com/p/474326864
https://blog.csdn.net/wintersweetzeng/article/details/47319115
"""

# 1
code, shell_content = subprocess.getstatusoutput("/opt/mcu/{}/shells/config.sh {}".format(module, mooo))

# 2
p = subprocess.Popen("/opt/mcu/{}/shells/config.sh {}".format(module, mooo), shell=True, bufsize=10,                      stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
code = p.returncode

"""
1、官方推荐subprocess.run底层使用的是subprocess.Popen
2、实测subprocess.Popen性能好一点，设置参数bufsize

参数说明：
subprocess.Popen( args, 
      bufsize=0, 
      executable=None,
      stdin=None,
      stdout=None, 
      stderr=None, 
      preexec_fn=None, 
      close_fds=False, 
      shell=False, 
      cwd=None, 
      env=None, 
      universal_newlines=False, 
      startupinfo=None, 
      creationflags=0)

args: 可以是一个字符串，可以是一个包含程序参数的列表。要执行的程序一般就是这个列表的第一项，或者是字符串本身。
bufsize: 作用就和内建函数open()一样：0表示不缓冲，1表示行缓冲，其他正数表示近似的缓冲区字节数，负数表
executable: 可以用于指定用哪个shell来执行（比如bash、csh、zsh等）
stdin stdout stderr: 分别表示子程序的标准输入、标准输出和标准错误。
preexec_fn: 设置为一个可调用的对象（比如函数），就会在子进程被执行前被调用。（仅限*nix）
close_fds: 设置成True，*nix下会在开子进程前把除了0、1、2以外的文件描述符都先关闭。在 Windows下也不会继承其他文件描述符。
shell: 设置成True，指定的命令会在shell里解释执行。
cwd: 不是None，则会把cwd做为子程序的当前目录。注意，并不会把该目录做为可执行文件的搜索目录
env: 不是None，则子程序的环境变量由env的值来设置，而不是默认那样继承父进程的环境变量。
universal_newlines: 设置成True，则子进程的stdout和stderr被视为文本对象
startupinfo和creationflags: 将会被传递给后面的CreateProcess()函数，用于指定子程序的各种其他属性，比如主窗口样式或者是子进程的优先级等


"""
